/**
 * Copyright (c) 2012, Hakans Pirates - 
 * Johan Andersson spaiki17@gmail.com, 
 * Mattias Lundberg lundberg.mattias@gmail.com, 
 * Samuel Sjodin sjoodin@gmail.com
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of the <organization> nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *  
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package pirates.crates;

import com.jme3.app.SimpleApplication;
import com.jme3.asset.AssetManager;
import com.jme3.bullet.PhysicsSpace;
import com.jme3.material.Material;
import com.jme3.math.Vector3f;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
import com.jme3.texture.Texture;
import java.util.concurrent.Callable;
import pirates.Settings;
import pirates.util.CollisionShapeFactory;

/**
 * 
 * @author mattias
 */
public class FloatingCrate {

	public static int nextId = 1;
	public final int id;
	public int numCannonBalls;
	public int numHealt;
	public Spatial crateModel;
	public Node rootNode;
	private PhysicsSpace space;
	private AssetManager assetManager;
	private final CrateControl crateControl;
	private SimpleApplication app;
	public boolean pickedup = false;
	public String name;

	public FloatingCrate(SimpleApplication app, Node rootNode,
		int numCannonBalls, int numHealt, Vector3f pos, PhysicsSpace space,
		String name) {
		this.numCannonBalls = numCannonBalls;
		this.numHealt = numHealt;
		this.rootNode = rootNode;
		this.space = space;
		this.app = app;
		id = nextId++;
		this.name = name;

		assetManager = app.getAssetManager();
		crateModel = assetManager.loadModel(Settings.CRATE_MODEL);
		crateModel.scale(20);
		crateControl = new CrateControl(app,
			CollisionShapeFactory.createBox(crateModel), space, this);
		crateModel.setLocalTranslation(pos);
		crateModel.setName(name);

		Material mat_crate = new Material(assetManager,
			"Common/MatDefs/Misc/Unshaded.j3md");
		Texture texture = assetManager.loadTexture("Models/Crates/WoodPlanks_Color.jpg");
		mat_crate.setTexture("ColorMap", texture);
		crateModel.setMaterial(mat_crate);

		space.addCollisionListener(crateControl);
		space.add(crateControl);
		crateModel.addControl(crateControl);
		rootNode.attachChild(crateModel);
	}

	public FloatingCrate(SimpleApplication app, Node rootNode,
		int numCannonBalls, int numHealt, Vector3f pos, PhysicsSpace space) {
		this(app, rootNode, numCannonBalls, numHealt, pos, space,
			Settings.HOST_NAME + nextId++ + "");
	}

	public int getNumCannonBalls() {
		return numCannonBalls;
	}

	public int getNumHealth() {
		return numHealt;
	}

	public void remove() {
		// numCannonBalls = 0;
		// numHealt = 0;
		app.enqueue(new Callable() {

			public Object call() throws Exception {
				rootNode.detachChild(crateModel);
				return null;
			}
		});

		space.enqueue(new Callable() {

			public Object call() throws Exception {
				space.removeCollisionListener(crateControl);
				return null;
			}
		});

	}
}
